package tieba.core.utils;

import javax.ws.rs.core.Response;

import tieba.core.exception.BaseException;
import tieba.core.utils.entity.Result;

public class ReturnType {

	/**
	 * @param stateCode
	 *            HTTP状态码
	 * @param entity
	 *            需要返回的实体对象
	 * @return <li>返回对象，此方法在发生异常时(需要自定义HTTP状态码时)被调用返回
	 */
	public static <T> Response on(int stateCode, T entity) {
		return Response.status(stateCode).entity(entity).build();
	}

	/**
	 * @param entity
	 *            需要返回的实体对象
	 * @return <li>返回对象，此方法在HTTP状态码为200时调用返回
	 */
	public static <T> Response on(T entity) {
		return Response.ok(entity).build();
	}

	/**
	 * @param entity
	 *            需要返回的实体对象
	 * @return <li>返回对象，此方法在HTTP状态码为200时调用返回
	 */
	public static <T> Response on(T entity, int status) {
		return Response.ok(entity).status(status).build();
	}

	/**
	 * @return 返回成功(默认info为:SUCCESS)
	 */
	public static Response success() {
		return on(new Result(0, "SUCCESS"));
	}

	/**
	 * @param message
	 *            自定义返回的info内容
	 * @return 返回成功(自定义消息)
	 */
	public static Response success(String message) {
		return on(new Result(0, message));
	}

	/**
	 * @param message
	 *            自定义返回的info内容
	 * @param entity
	 *            需要返回的对象
	 * @return 返回成功(自定义消息)，并且带对象一起返回
	 */
	public static <T> Response success(String message, T entity) {
		return on(new Result(0, message, entity));
	}
	/**
	 * @param entity
	 *            需要返回的对象
	 * @return 返回成功，并且带对象一起返回
	 */
	public static <T> Response success(T entity) {
		return on(entity);
	}
	/**
	 * @param code
	 *            错误编号
	 * @param message
	 *            错误消息
	 * @return 返回失败
	 */
	public static <T> Response fail(int code, String message) {
		return on(new Result(code, message), code);
	}

	/**
	 * @param code
	 *            错误编号
	 * @param message
	 *            错误消息
	 * @param entity
	 *            错误对象
	 * @return 返回失败，并返回指定对象
	 */
	public static <T> Response fail(int code, String message, T entity) {
		return on(new Result(code, message, entity));
	}

	/**
	 * @return 返回失败，未知错误
	 */
	public static <T> Response fail() {
		return on(new Result(500, "未知错误"), 500);
	}
	/**
	 * <li>所有Resource处异常处理都建议调用此方法
	 *
	 * @param e
	 *            异常对象
	 * @return 根据异常类型返回指定错误编码和消息
	 */
	public static <T> Response fail(BaseException e) {
		return on(new Result(e.getErrorCode(), e.getMessage()), e.getStatus());
	}

	/**
	 *
	 * @param e
	 *            异常对象
	 * @param entity
	 *            需要带出的对象实例
	 * @return 根据异常类型返回指定错误编码和消息以及实例对象
	 */
	public static <T> Response fail(BaseException e, T entity) {
		return on(new Result(e.getErrorCode(), e.getMessage(), entity),
				e.getStatus());
	}
}
